
/**********************************************************************************\
** 文件名称: LLTask.c
** 创建人员: YCG
** 创建日期: 2019-03-13
** 文档描述:
** 版本代号: V0.1
** 版本说明: 初始版本
\********************************************************************************/

#include "LLTask.h"
#include "cmsis_os.h"
#include "fatfs.h"
#include "heap.h"
#include "led.h"
LLReceive_t yLLRece[1];
extern CRC_HandleTypeDef hcrc;

LLPack_t* LL_PackedData( uint8_t yPackCtrl, uint16_t yDataNum, uint16_t yPackNum, uint16_t yPackCount, uint8_t * ySrc);

/*******************************************************************************
** 函数名称: StartAPPTask
** 功能描述:
** 参数说明: argument: [输入/出]
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2019-03-10
********************************************************************************/
void StartLLTask(void const * argument)
{
    for(;;)
    {
        LLPack_t* yPack;
        yPack = LL_PackedData(0x81, sizeof("水下无线光通信数据帧测试!"), 1, 1, (uint8_t*)"水下无线光通信数据帧测试!");
       // UprintfBuf((uint8_t*)yPack, PackSize(yPack));


      //  Uprintf("\n起始信号:0x%2x\n", yPack->StartCheck);
//			 osDelay(1);
//
//			 Uprintf("控制位段:0x%2x\n",yPack->PackCtrl.u8[0]);
//			 osDelay(1);
//			 Uprintf("数据数量:0x%2x\n",yPack->DataNum.u16);
//			 osDelay(1);
//			 Uprintf("帧总数量:0x%2x\n",yPack->PackNum.u16);
//			 osDelay(1);
//			 Uprintf("帧计数  :0x%2x\n",yPack->PackCount.u16);
//			 osDelay(1);
//
//			 Uprintf("帧头CRC:0x%4x\n",yPack->PackCRC.u32);
//			 osDelay(1);
//
//			 Uprintf("数据UTF-8编码:%s\n","水下无线光通信数据帧测试!");
//			 osDelay(1);
//
//			 Uprintf("数据CRC:0x%4x\n",*(uint32_t *)(&(yPack->Data)+Allgnment4(yPack->DataNum.u16)));
//			 osDelay(1);


        MyFree(yPack);

        osDelay(500);
    }
}

/*******************************************************************************
** 函数名称: LL_PackData
** 功能描述: 将需要发送的数据进行打包
** 参数说明: yPackCtrl: [输入] 包类型
**			     yPackNum:  [输入] 包序号
**			     yDataNum:  [输入] 此包的数据数量
**			     ySrc: [输入]     源数据地址
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2019-03-22
********************************************************************************/
LLPack_t* LL_PackedData( uint8_t yPackCtrl, uint16_t yDataNum, uint16_t yPackNum, uint16_t yPackCount, uint8_t * ySrc)
{
    LLPack_t* yLLPack = MyMalloc(sizeof(LLPack_t) + yDataNum);   //申请内存地址,内存的申请是8字节对齐的

    yLLPack->StartCheck.u32 = 0x17117019;    //起始信号

    yLLPack->PackCtrl.u8[0] =  yPackCtrl;    //包控制位段
    yLLPack->PackCtrl.u8[1] = ~yPackCtrl;    //包控制校验

    yLLPack->DataNum.u16   = yDataNum;       //数据数量
    yLLPack->PackNum.u16   = yPackNum;       //帧总数量
    yLLPack->PackCount.u16 = yPackCount;     //帧计数

    yLLPack->PackCRC.u32 = HAL_CRC_Calculate(&hcrc,  (uint32_t*)yLLPack, 3);    //帧头计算CRC

    memcpy(&yLLPack->Data, ySrc, yDataNum);  //复制数据到数据帧

    uint8_t   yAllgnment = yDataNum & 0x03;   //判断有没有四字节对齐
    uint16_t  DataNum = 0;

    if(yAllgnment == 0) {   //已对齐
        DataNum = yDataNum;
    } else {                 //未对齐
        DataNum = yDataNum + 4 - yAllgnment; //进行对齐
        memset(&yLLPack->Data + yDataNum, 0x00, 4 - yAllgnment); //补齐0
    }

    uint32_t* yDataCRC = (uint32_t*)(&yLLPack->Data + DataNum);     //计算数据CRC地址
    *yDataCRC = HAL_CRC_Calculate(&hcrc, (uint32_t*)&yLLPack->Data, DataNum >> 2);   //数据计算CRC

    return yLLPack;
}

/********************************End of File************************************/
